home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / asynchat.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2008-10-13  |  6.1 KB  |  231 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import socket
  5. import asyncore
  6. from collections import deque
  7.  
  8. class async_chat(asyncore.dispatcher):
  9.     ac_in_buffer_size = 4096
  10.     ac_out_buffer_size = 4096
  11.     
  12.     def __init__(self, conn = None):
  13.         self.ac_in_buffer = ''
  14.         self.ac_out_buffer = ''
  15.         self.producer_fifo = fifo()
  16.         asyncore.dispatcher.__init__(self, conn)
  17.  
  18.     
  19.     def collect_incoming_data(self, data):
  20.         raise NotImplementedError, 'must be implemented in subclass'
  21.  
  22.     
  23.     def found_terminator(self):
  24.         raise NotImplementedError, 'must be implemented in subclass'
  25.  
  26.     
  27.     def set_terminator(self, term):
  28.         self.terminator = term
  29.  
  30.     
  31.     def get_terminator(self):
  32.         return self.terminator
  33.  
  34.     
  35.     def handle_read(self):
  36.         
  37.         try:
  38.             data = self.recv(self.ac_in_buffer_size)
  39.         except socket.error:
  40.             why = None
  41.             self.handle_error()
  42.             return None
  43.  
  44.         self.ac_in_buffer = self.ac_in_buffer + data
  45.         while self.ac_in_buffer:
  46.             lb = len(self.ac_in_buffer)
  47.             terminator = self.get_terminator()
  48.             if not terminator:
  49.                 self.collect_incoming_data(self.ac_in_buffer)
  50.                 self.ac_in_buffer = ''
  51.                 continue
  52.             if isinstance(terminator, int) or isinstance(terminator, long):
  53.                 n = terminator
  54.                 if lb < n:
  55.                     self.collect_incoming_data(self.ac_in_buffer)
  56.                     self.ac_in_buffer = ''
  57.                     self.terminator = self.terminator - lb
  58.                 else:
  59.                     self.collect_incoming_data(self.ac_in_buffer[:n])
  60.                     self.ac_in_buffer = self.ac_in_buffer[n:]
  61.                     self.terminator = 0
  62.                     self.found_terminator()
  63.             lb < n
  64.             terminator_len = len(terminator)
  65.             index = self.ac_in_buffer.find(terminator)
  66.             if index != -1:
  67.                 if index > 0:
  68.                     self.collect_incoming_data(self.ac_in_buffer[:index])
  69.                 
  70.                 self.ac_in_buffer = self.ac_in_buffer[index + terminator_len:]
  71.                 self.found_terminator()
  72.                 continue
  73.             index = find_prefix_at_end(self.ac_in_buffer, terminator)
  74.             if index:
  75.                 if index != lb:
  76.                     self.collect_incoming_data(self.ac_in_buffer[:-index])
  77.                     self.ac_in_buffer = self.ac_in_buffer[-index:]
  78.                 
  79.                 break
  80.                 continue
  81.             self.collect_incoming_data(self.ac_in_buffer)
  82.             self.ac_in_buffer = ''
  83.  
  84.     
  85.     def handle_write(self):
  86.         self.initiate_send()
  87.  
  88.     
  89.     def handle_close(self):
  90.         self.close()
  91.  
  92.     
  93.     def push(self, data):
  94.         self.producer_fifo.push(simple_producer(data))
  95.         self.initiate_send()
  96.  
  97.     
  98.     def push_with_producer(self, producer):
  99.         self.producer_fifo.push(producer)
  100.         self.initiate_send()
  101.  
  102.     
  103.     def readable(self):
  104.         return len(self.ac_in_buffer) <= self.ac_in_buffer_size
  105.  
  106.     
  107.     def writable(self):
  108.         if self.ac_out_buffer == '' and self.producer_fifo.is_empty():
  109.             pass
  110.         return not (self.connected)
  111.  
  112.     
  113.     def close_when_done(self):
  114.         self.producer_fifo.push(None)
  115.  
  116.     
  117.     def refill_buffer(self):
  118.         while len(self.producer_fifo):
  119.             p = self.producer_fifo.first()
  120.             if p is None:
  121.                 if not self.ac_out_buffer:
  122.                     self.producer_fifo.pop()
  123.                     self.close()
  124.                 
  125.                 return None
  126.             elif isinstance(p, str):
  127.                 self.producer_fifo.pop()
  128.                 self.ac_out_buffer = self.ac_out_buffer + p
  129.                 return None
  130.             
  131.             data = p.more()
  132.             if data:
  133.                 self.ac_out_buffer = self.ac_out_buffer + data
  134.                 return None
  135.             else:
  136.                 self.producer_fifo.pop()
  137.             data
  138.             return None
  139.             continue
  140.             return None
  141.  
  142.     
  143.     def initiate_send(self):
  144.         obs = self.ac_out_buffer_size
  145.         if len(self.ac_out_buffer) < obs:
  146.             self.refill_buffer()
  147.         
  148.         if self.ac_out_buffer and self.connected:
  149.             
  150.             try:
  151.                 num_sent = self.send(self.ac_out_buffer[:obs])
  152.                 if num_sent:
  153.                     self.ac_out_buffer = self.ac_out_buffer[num_sent:]
  154.             except socket.error:
  155.                 why = None
  156.                 self.handle_error()
  157.                 return None
  158.             except:
  159.                 None<EXCEPTION MATCH>socket.error
  160.             
  161.  
  162.         None<EXCEPTION MATCH>socket.error
  163.  
  164.     
  165.     def discard_buffers(self):
  166.         self.ac_in_buffer = ''
  167.         self.ac_out_buffer = ''
  168.         while self.producer_fifo:
  169.             self.producer_fifo.pop()
  170.  
  171.  
  172.  
  173. class simple_producer:
  174.     
  175.     def __init__(self, data, buffer_size = 512):
  176.         self.data = data
  177.         self.buffer_size = buffer_size
  178.  
  179.     
  180.     def more(self):
  181.         if len(self.data) > self.buffer_size:
  182.             result = self.data[:self.buffer_size]
  183.             self.data = self.data[self.buffer_size:]
  184.             return result
  185.         else:
  186.             result = self.data
  187.             self.data = ''
  188.             return result
  189.  
  190.  
  191.  
  192. class fifo:
  193.     
  194.     def __init__(self, list = None):
  195.         if not list:
  196.             self.list = deque()
  197.         else:
  198.             self.list = deque(list)
  199.  
  200.     
  201.     def __len__(self):
  202.         return len(self.list)
  203.  
  204.     
  205.     def is_empty(self):
  206.         return not (self.list)
  207.  
  208.     
  209.     def first(self):
  210.         return self.list[0]
  211.  
  212.     
  213.     def push(self, data):
  214.         self.list.append(data)
  215.  
  216.     
  217.     def pop(self):
  218.         if self.list:
  219.             return (1, self.list.popleft())
  220.         else:
  221.             return (0, None)
  222.  
  223.  
  224.  
  225. def find_prefix_at_end(haystack, needle):
  226.     l = len(needle) - 1
  227.     while l and not haystack.endswith(needle[:l]):
  228.         l -= 1
  229.     return l
  230.  
  231.